package com.kinyx.framework.reflect;

import java.lang.reflect.Field;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import lombok.Getter;
import lombok.Setter;

public class KFieldUtils_Tester_cache {

	@Getter
	@Setter
	public static class Super {

		private String str1;
		private String str2;

	}

	@Getter
	@Setter
	public static class Sub extends Super {

		private String str1;
		private String str3;

	}

	@Before
	public void before() {
		KFieldUtils.CACHE_LIST.clear();
		KFieldUtils.CACHE.clear();
	}

	@Test
	public void test1() {
		Assert.assertTrue(KFieldUtils.CACHE_LIST.isEmpty());
		Assert.assertTrue(KFieldUtils.CACHE.isEmpty());

		// 取一个不存在的字段，先缓存所有列表，后无法取得。
		final Field field = KFieldUtils.getField(Super.class, "str", false, false);
		Assert.assertTrue(field == null);

		// 父类经过调用，已经缓存。
		Assert.assertTrue(KFieldUtils.CACHE_LIST.containsKey(Super.class));// 缓存列表会缓存该类
		Assert.assertTrue(Boolean.FALSE.equals(KFieldUtils.CACHE.get(Super.class, "str")));// 不存在的字段将会缓存为false
		Assert.assertTrue(KFieldUtils.CACHE.get(Super.class, "str1") != null);// 列表缓存时字段都将缓存
		Assert.assertTrue(KFieldUtils.CACHE.get(Super.class, "str2") != null);// 列表缓存时字段都将缓存

		// 子类未调用，因而未缓存。
		Assert.assertTrue(!KFieldUtils.CACHE_LIST.containsKey(Sub.class));
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str1") == null);
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str2") == null);
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str3") == null);
	}

	@Test
	public void test2() {
		Assert.assertTrue(KFieldUtils.CACHE_LIST.isEmpty());
		Assert.assertTrue(KFieldUtils.CACHE.isEmpty());

		// 取一个不存在的字段，先缓存所有列表，后取得。
		final Field field = KFieldUtils.getField(Sub.class, "str1", false, false);
		Assert.assertTrue(field != null);

		// 父类未调用，因而未缓存。
		Assert.assertTrue(!KFieldUtils.CACHE_LIST.containsKey(Super.class));
		Assert.assertTrue(KFieldUtils.CACHE.get(Super.class, "str1") == null);
		Assert.assertTrue(KFieldUtils.CACHE.get(Super.class, "str2") == null);

		// 子类经过调用，已经缓存。
		Assert.assertTrue(KFieldUtils.CACHE_LIST.containsKey(Sub.class));// 缓存列表会缓存该类
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str1") != null);// 列表缓存时字段都将缓存
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str2") != null);// 列表缓存时字段都将缓存
		Assert.assertTrue(KFieldUtils.CACHE.get(Sub.class, "str3") != null);// 列表缓存时字段都将缓存
	}

}
